package cn.zzf.algs.note.base.collection.v2;

import cn.zzf.algs.note.base.struct.Node;

import java.util.Iterator;

/**
 * 链表实现一个可添加元素的容器
 *
 * @author GaoFeng2017
 * @date 2020/6/11 14:21
 */
public class LinkedTable<T> implements Iterable<T> {

    /** 尾节点 */
    private Node<T> lastNode;

    /** 链表长度 */
    private int size;

    public LinkedTable() {

    }

    /** 向链表中添加一个元素 */
    public void add(T element) {
        // 实现方法，插入新元素时，首结点的结点值等于当前要插入的值，同时首节点的next指向旧的节点
        if (this.lastNode == null) {
            this.lastNode = new Node<>(null, element);
        } else {
            this.lastNode = new Node<>(this.lastNode, element);
        }

        this.size++;
    }


    /**  获取链表长度*/
    public int size() {
        return this.size;
    }

    @Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {

            /** 当前遍历到的结点 */
            private Node<T> currentNode= lastNode;

            @Override
            public boolean hasNext() {
                return currentNode != null;
            }

            @Override
            public T next() {
                T value = currentNode.getValue();
                currentNode = currentNode.getPrev();
                return value;
            }
        };
    }

}
